home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks ’92 / Bell Choir ƒ / choir source / CGetMembers.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-18  |  6.4 KB  |  249 lines  |  [TEXT/KAHL]

  1. #include "myIncludes.h"
  2. #include "myProtos.h"
  3.  
  4.  
  5. AEDesc    *gMembers[20];
  6. long    gTix[20];
  7. long    gmyTix[20];
  8. short    gMidiPart[256];
  9. long    gNumTrebNotes;
  10. long    gNumBassNotes;
  11.  
  12.  
  13. void zero_mem(char    *ptr, long len);
  14. void zero_mem(char    *ptr, long len)
  15. {
  16.     if (len > 0)
  17.         while (len--)
  18.             *ptr++ = 0;
  19. }
  20.  
  21.  
  22. void copy_mem( void *ptr1, void *ptr2, long len)
  23. {
  24. register char *p1=ptr1, *p2=ptr2;
  25.  
  26.     if (len > 0)
  27.         while (len--)
  28.             *p2++ = *p1++;
  29. }
  30.  
  31.  
  32. pascal Boolean filterProc(EventRecord *eventIn, long sleep, long transID, AEAddressDesc *adddr);
  33. pascal Boolean filterProc(EventRecord *eventIn, long sleep, long transID, AEAddressDesc *adddr)
  34. {
  35.     return(true);
  36. }
  37.  
  38.  
  39. OSErr get_self(long    *numNeeded)
  40. {
  41. OSErr        err;
  42. AEDesc        *myAddrDescP;
  43. AppleEvent    theEvent, reply;
  44. long        myTix, theirTix;
  45. Size        actualSize;
  46. DescType    actualType;
  47. ProcessSerialNumber        mypsn;
  48.     
  49.     if (err = GetCurrentProcess(&mypsn))
  50.         return(err);
  51.     
  52.     myAddrDescP = (AEDesc *)NewPtrClear(sizeof(AEDesc));     /* this stays around for sending */
  53.     if ( (err = MemError()) || (myAddrDescP == NULL) )
  54.         return(err?err:-2);
  55.     
  56.     err = AECreateDesc(typeProcessSerialNumber, (Ptr)&mypsn, sizeof(ProcessSerialNumber), myAddrDescP);
  57.     if (err == noErr)
  58.         err = AECreateAppleEvent(kChoirEventClass, STEP1, myAddrDescP,
  59.                 kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
  60.     
  61.     if (err == noErr)
  62.         err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  63.                 kAEHighPriority, 60*2, NULL, filterProc);
  64.     if (err == noErr)
  65.         err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  66.                 kAEHighPriority, 60*2, NULL, filterProc);
  67.     if (err == noErr)
  68.         {
  69.         err = AEGetParamPtr(&reply, TICKS_PARAM, typeLongInteger, &actualType, 
  70.                     (Ptr)&theirTix, sizeof(theirTix), &actualSize);
  71.         if (err == noErr)
  72.             {    /* add to list of choir members */
  73.             gMembers[0] = myAddrDescP;
  74.             gTix[0] = /*myTix -*/ theirTix;
  75.             gmyTix[0] = TickCount();
  76.             }
  77.         else
  78.             SysBeep(0);
  79.         }
  80.     
  81.     if (err)
  82.         *numNeeded = 0;
  83.     else
  84.         *numNeeded = 1;
  85.     return(err);
  86. }
  87.  
  88.  
  89. OSErr get_members(long    *numNeeded)
  90. {
  91. OSErr            err;
  92. ATNBPRecHandle    nbph;
  93. EntityName        entity;
  94. AddrBlock        addr;
  95. short            i;
  96. AEDesc            *myAddrDescP;
  97. AppleEvent        theEvent, reply;
  98. TargetID        targ;
  99. PortInfoRec        port;
  100. IPCListPortsPBRec    ipclist;
  101. long            myTix, theirTix, numFound;
  102. Size            actualSize;
  103. DescType        actualType;
  104. ProcessSerialNumber        mypsn;
  105.  
  106.     numFound = 0;
  107.     
  108.     if (err = GetCurrentProcess(&mypsn))
  109.         return(err);
  110.     
  111.     myAddrDescP = (AEDesc *)NewPtrClear(sizeof(AEDesc));     /* this stays around for sending */
  112.     if ( (err = MemError()) || (myAddrDescP == NULL) )
  113.         return(err?err:-2);
  114.     
  115.     err = AECreateDesc(typeProcessSerialNumber, (Ptr)&mypsn, sizeof(ProcessSerialNumber), myAddrDescP);
  116.     if (err == noErr)
  117.         err = AECreateAppleEvent(kChoirEventClass, STEP1, myAddrDescP,
  118.                 kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
  119.     
  120.     if (err == noErr)
  121.         err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  122.                 kAEHighPriority, 60*2, NULL, filterProc);
  123.     if (err == noErr)
  124.         err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  125.                 kAEHighPriority, 60*2, NULL, filterProc);
  126.     if (err == noErr)
  127.         {
  128.         err = AEGetParamPtr(&reply, TICKS_PARAM, typeLongInteger, &actualType, 
  129.                     (Ptr)&theirTix, sizeof(theirTix), &actualSize);
  130.         if (err == noErr)
  131.             {    /* add to list of choir members */
  132.             gMembers[numFound] = myAddrDescP;
  133.             gTix[numFound] = /*myTix -*/ theirTix;
  134.             gmyTix[numFound] = TickCount();
  135.             numFound++;
  136.             }
  137.         }
  138.  
  139.     if (*numNeeded <= 0)
  140.         return(-1);
  141.     
  142.     if ( err = MPPOpen())
  143.         return(err);
  144.     
  145.     nbph = (ATNBPRecHandle)NewHandleClear(sizeof(ATNBPRec));
  146.     if ( (err = MemError()) || nbph == NULL )
  147.         return(err?err:-1);
  148.     
  149.     entity.objStr[ 0 ] = 1;
  150.     entity.objStr[ 1 ] = '=';
  151.     copy_mem( "\pPPCToolBox", entity.typeStr, 11 );
  152.     entity.zoneStr[ 0 ] = 1;
  153.     entity.zoneStr[ 1 ] = '*';
  154.  
  155.     HLock( nbph );
  156.     (**nbph).nbpEntityPtr = &entity;
  157.     (**nbph).nbpDataField = 5 * *numNeeded;
  158.     (**nbph).nbpBufSize = 5 * (*numNeeded * ( 33 + sizeof( AddrBlock ) + 4 ));
  159.     (**nbph).nbpBufPtr = NewPtr((**nbph).nbpBufSize);
  160.     if ( (err = MemError()) || (**nbph).nbpBufPtr == NULL )
  161.         {
  162.         DisposHandle(nbph);
  163.         return(err?err:-1);
  164.         }
  165.     
  166.     (**nbph).nbpRetransmitInfo.retransInterval = 2;
  167.     (**nbph).nbpRetransmitInfo.retransCount = 3;
  168.     HUnlock( nbph );
  169.     if ( err = NBPLookup( nbph, FALSE ))
  170.         {
  171.         DisposPtr( (**nbph).nbpBufPtr );
  172.         DisposHandle( nbph );
  173.         return(err);
  174.         }
  175.     
  176.     HLock(nbph);
  177.     for ( i = 1; i <= (**nbph).nbpDataField; ++i ) 
  178.         {
  179.         if ( err = NBPExtract((**nbph).nbpBufPtr, (**nbph).nbpDataField, i, &entity, &addr) )
  180.             {
  181.             DisposPtr( (**nbph).nbpBufPtr );
  182.             DisposHandle( nbph );
  183.             return( err );
  184.             }
  185.         
  186.         /* ON REMOTE MAC:  LAUNCH APPLICATION */
  187.         
  188.         targ.name.nameScript = smRoman;
  189.         copy_mem( "\pchorus", targ.name.name, 7 );
  190.  
  191.         targ.name.portKindSelector = ppcByString;
  192.         targ.name.u.portTypeStr[0] = 1;
  193.         targ.name.u.portTypeStr[1] = '=';
  194.         targ.location.locationKindSelector = ppcNBPLocation;
  195.         targ.location.u.nbpEntity = entity;
  196.         
  197.         
  198.         zero_mem( (char *)&ipclist, sizeof( ipclist ));
  199.         ipclist.startIndex = 0;
  200.         ipclist.requestCount = 1;
  201.         ipclist.portName = &targ.name;
  202.         ipclist.locationName = &targ.location;
  203.         ipclist.bufferPtr = &port;
  204.         if (( err = IPCListPorts(&ipclist, FALSE))  )
  205.             return(err ? err : -1);
  206.         
  207.         if (ipclist.actualCount > 0)
  208.             {
  209.             targ.name = port.name;
  210.             
  211.             myAddrDescP = (AEDesc *)NewPtrClear(sizeof(AEDesc));     /* this stays around for sending */
  212.             if ( (err = MemError()) || (myAddrDescP == NULL) )
  213.                 return(err?err:-2);
  214.             
  215.             err = AECreateDesc(typeTargetID, (Ptr)&targ, sizeof(targ), myAddrDescP);
  216.             if (err == noErr)
  217.                 err = AECreateAppleEvent(kChoirEventClass, STEP1, myAddrDescP,
  218.                         kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
  219.             
  220.             if (err == noErr)
  221.                 err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  222.                         kAEHighPriority, 60*20, NULL, NULL);
  223.             if (err == noErr)
  224.                 err = AESend(&theEvent, &reply, kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  225.                         kAEHighPriority, 60*20, NULL, NULL);
  226.             if (err == noErr)
  227.                 {
  228.                 err = AEGetParamPtr(&reply, TICKS_PARAM, typeLongInteger, &actualType, 
  229.                             (Ptr)&theirTix, sizeof(theirTix), &actualSize);
  230.                 if (err == noErr)
  231.                     {    /* add to list of choir members */
  232.                     gMembers[numFound] = myAddrDescP;
  233.                     gTix[numFound] = /*myTix -*/ theirTix;
  234.                     gmyTix[numFound] = TickCount();
  235.                     numFound++;
  236.                     }
  237.                 else
  238.                     SysBeep(0);
  239.                 
  240.                 err = AEDisposeDesc(&theEvent);
  241.                 }
  242.             }
  243.         
  244.         }
  245.     
  246.     *numNeeded = numFound;
  247.     return(numFound <= 0);
  248. }
  249.